package javafoundation.reference;

import java.lang.ref.SoftReference;
import java.util.ArrayList;
import java.util.List;

/**
 * @ClassName SoftReferenceDemo
 * @Description TODO 软引用
 * @Author dzf
 * @Date 2023/3/15 10:22
 * @Version 1.0
 */
public class SoftReferenceDemo {
    public static void main(String[] args) {
        //系统至少维护着对象的一个强引用（Strong Reference）

        //...一堆业务代码
        List<String> list = new ArrayList<>();
        //。。。业务代码使用到了List实例

        //使用完了 list ，将他设置成soft 引用类型，并且释放强引用；
        //软引用（Soft Reference）、弱引用（Weak Reference）或虚引用（Phantom Reference）
        SoftReference sr = new SoftReference<>(list);
        list = null;

        //这个时候他是可能执行一次GC的
        System.gc();

        // 下次在使用时
        if (null != sr){
            list = (List<String>) sr.get();
            System.out.println(list);
        } else {
            //GC由于内存资源不足，可能系统收回了list的软引用，因此需要重新装载
            list = new ArrayList<>();
            sr = new SoftReference<>(list);
        }

    }
}
